// pages/cart/index.js
// 1 获取用户的收货地址逻辑思路
//     1)绑定事件
//     2）调用小程序内部api 获取用户收货地址 wx.chooseAddress
//     2)获取用户对小程序所授予 获取地址的权限状态 scope
//      2.1）假设用户点击获取收货地址的提示框 确定 authSetting scope.chooseAddress
//      scope 值 true 直接调用 获取用户收货地址
//      2.2）假设用户从来没有到用过 收货地址api
//      scope undefined 直接调用获取收货地址
//     3）假设 用户 点击收货地址的提示框取消
//      scope值false
//        3.1）诱导用户 自己   授权设置页面（wx.openSetting) 当用户从新给予 获取收货地址权限的时候
//        3.2)获取收货地址权限的时候
//     4）把获取到的收货地址 存入到 本地存储中去
// 2 页面加载完毕
//     2.1）onload onshow
//     2.3)获取本地存储中的地址数据
//     2.4）把数据设置给data 中的一个变量


// 引入用来发送请求的 方法 一定要把路径补全
import {getSetting,chooseAddress,openSetting,showModal,showToast} from '../../utils/asyncWX.js'
import regeneratorRuntime from '../../lib/runtime/runtime'


Page({

    /**
     * 页面的初始数据
     */
    data: {
        address:{},
        cart:[],
        allChecked:false,
        totalPrice:0,
        totalNum:0,

    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad: function (options) {

    },
    

    // 获取收货地址的按钮绑定的方
    async handleChooseAddress(){
        // 获取收货地址
        // wx.chooseAddress({
        //   success: (result) => {
        //       console.log(result)
        //   },
        // })

    //    查看用户获取收货地址的权限的状态 scope
        // wx.getSetting({
        //   withSubscriptions: true,
        //   success:(result)=>{
        //       console.log(result)
        //   }
        // })

//  完整正常的业务代码(未 优化时的代码)
        // 1 获取权限 权限状态
        // wx.getSetting({
        //   withSubscriptions: true,
        //   success:(result)=>{
        //         //   console.log(result)
        //         // 2 获取权限状态 主要发现一些 属性名恒怪异的时候 都要使用[] 形式来获取属性值
        //         let scopeAddress=result.authSetting['scope.address'];
        //         if(scopeAddress==undefined || scopeAddress==true){
        //             wx.chooseAddress({
        //               success: (result1) => {
        //                 console.log(result1)
        //               },
        //             })

        //         }else{
        //             // 3 用户之前拒绝过权限请求 就要先诱导用户自己去开启权限授权页面
        //             wx.openSetting({
        //                 success:(result2)=>{
        //                     console.log(result2)

        //                 }
        //             })
        //         }





        //       }
        // })





        //  完整正常的业务代码(优化后的代码)
    //     try{
    //     // 1 获取权限状态
    //     const res1=await getSetting();
    //     let scopeAddress=res1.authSetting['scope.address'];
    //     // 判断权限状态
    //     if(scopeAddress==undefined || scopeAddress==true){
    //         // 调用收货地址api
    //         const res2=await  chooseAddress();
    //         console.log(res2)
    //     }else{
    //         // 先诱导用户打开授权页面
    //         let res3 = await openSetting();
    //         // 获取收货地址的api
    //         const res2=await  chooseAddress();

    //     }
    // }catch(err){
    //     console.log(err) 

    // }


     //  完整正常的业务代码(最终优化后的代码)
        try{
        // 1 获取权限状态
        const res1=await getSetting();
        let scopeAddress=res1.authSetting['scope.address'];
        // 判断权限状态
        if(scopeAddress==false){
        // 先诱导用户打开授权页面
        let res3 = await openSetting();
        }  
         // 获取收货地址的api
         const res2=await  chooseAddress();
        //  将收货地址信息存储到本地
        wx.setStorageSync('address', res2)
    }catch(err){
        console.log(err)

    }
    },

// 3 动态渲染购物车页面
// 3.1)回到商品详情页面 第一次添加商品的时候 手动添加属性
//     num=1;checked=true;
// 3.2)获取缓存中的购物车数组
// 3.3）把购物车数组数据 填充到data中去

// 4 全选效果实现
// 4.1）onshow 获取缓存中的购物车数组
// 4.2）根据购物车中的商品数据 所有商品都被选择中 checked=true 全选就是被选中

// 5 总价格和总数量
//     5.1）都需要商品被选中 我们才能拿来计算
//     5.2）获取购物车数组
//     5.3）遍历
//     5.4）判断商品是否被选中
//     5.5）总价格 +=商品的单价*商品的数量
//     5.6）总数量 +=商品的数量
//     5.7）把计算后的价格和数量 设置回data中去即可

    onShow(){
        // 获取本地存储汇中的地址信息
        const address=wx.getStorageSync('address')
        address.all=address.provinceName+address.cityName+address.countyName+address.detailInfo+address.nationalCode;
        // 3 获取缓存中的购物车数组数据
        const cart= wx.getStorageSync('cart');
        // 计算全选：every 数组方法 会遍历 会接收一个回调函数 那么 每一个回调函数都返回true；
        // 只要 有一个回调函数返回来了false 那么不在循环执行 ，直接返回false
        // 空数组 调用every 返回值就是true
        const allChecked=cart.length?cart.every(v=>v.checked):false;

        // 计算总价格和总数量
        let totalPrice=0;
        let totalNum=0;
        cart.forEach(v=>{
            if(v.checked){
                totalPrice += v.num*v.goods_price;
                totalNum +=v.num
            }
        })


        // 给data中的变量赋值
        this.setData({
            address,
            cart,
            allChecked,
            totalPrice,
            totalNum

        })

    },

    // 6 商品选择中效果
            // 6.1 绑定change事件
            // 6.2 获取被修改的商品对象
            // 6.3 商品对象的选中状态进行反选
            // 6.4 重新的填充回data 和 缓存中
            // 6.5 重新去计算全选 总价格 总价格和总数量
     handleItemChange(e){
        //  console.log(e.currentTarget.dataset.id)
        // 获取被修改对象的id
        var goods_id=e.currentTarget.dataset.id;
        // 获取购物车数组
        let {cart}=this.data;
        // 找到被修改的商品对象
        let index= cart.findIndex(v=>v.goods_id===goods_id);
        // 选中状态取反
        cart[index].checked=!cart[index].checked;
        // console.log(index)
        // 把购物车数据重新设置回data 中和缓存中
        this.setData({
            cart
        });
        wx.setStorageSync('cart', cart)

    //  设置购物车的状态同时 重新计算 底部工具栏的数据 全选 总价格 购买的数量
        const allChecked=cart.length?cart.every(v=>v.checked):false;

        // 计算总价格和总数量
        let totalPrice=0;
        let totalNum=0;
        cart.forEach(v=>{
            if(v.checked){
                totalPrice += v.num*v.goods_price;
                totalNum +=v.num
            }
        })
        // 给data中的变量赋值
        this.setData({

            cart,
            allChecked,
            totalPrice,
            totalNum

        })
     },


    //  设置购物车的状态同时 重新计算 底部工具栏的数据 全选 总价格 购买的数量(封装函数)
    setCart(cart){
        let  allChecked=true;
        // 总价格 总数量let totalPrice=0;
        let totalPrice=0;
        let totalNum=0;
        cart.forEach(v=>{
            if(v.checked){
                totalPrice += v.num*v.goods_price;
                totalNum +=v.num
            } else{
            allChecked=false}
            
        })
        // 判断数组是否为空
        allChecked=cart.length != 0 ? allChecked:false;
          // 给data中的变量赋值
          this.setData({
            cart,
            allChecked,
            totalPrice,
            totalNum

        })
        wx.setStorageSync('cart', cart)
},
 

// 7 全选和反选
        // 7.1 全选复选框绑定事件 ChannelMergerNode
        // 7.2 获取data中的全选变量 allChecked
        // 7.3 直接取反 allChecked= !allChecked
        // 7.4 遍历购物车数组 让里面 商品 选中状态跟随 allChecked 改变而改变
        // 7.5 把购物车数组 和 allChecked 从新设置贵data 把购物车从新设置回 缓存中
    
        handleItemAllChecked(){
            // 获取data中的全选变量 
            let {cart,allChecked}=this.data;
            // 修改值
            allChecked = !allChecked;
            // 循环修改cart数组中的商品选中状态
            cart.forEach(v=>v.checked=allChecked);
            // 把修改后的值  填充回data或缓存中
            this.setCart(cart)


        },
        
        


        // 8 商品数量编辑
        //     8.1 给“+”、“-”按钮绑定同一个事件 区分的关键 是 自定义属性
        //             1)'+' '+1'
        //             2)'-' '-1'
        //     8.2 传递被点击商品的id goods_id
        //     8.3 获取data中的购物车数组 来获取被修改的商品对象
        //     8.4 当购物车的数量=1 同时 用户点击'-'
        //         弹窗提示（showModal） 询问用户 是否要删除
        //         1 确定 直接执行删除
        //         2 取消 什么都不做
        //     8.5 直接修改商品对象的数量 num
        //     8.6 把cart数组 从新设置回 缓存中和data中 this.setCart
        
        // 商品数量编辑功能
       async handleItemNumEdit(e){
            // 获取传过来的参数
            const {id,operation}=e.currentTarget.dataset;
            // console.log(id,operation)
            // 获取购物车数组
            let {cart}=this.data;
            // 找到需要修改的商品索引
            const index = cart.findIndex(v=>v.goods_id===id);
            // 判断是否要执行删除操作
            if(cart[index].num===1 && operation==-1){
                // 弹窗提示(未优化的代码)
                // wx,wx.showModal({
                //   content: '您是否要删除该商品？',
                //   showCancel: true,
                //   title: '提示',
                //   success: (result) => {
                //     //   console.log(result)
                //     if(result.confirm){
                //         cart.splice(index,1);
                //         this.setCart(cart)
                //     }else if(result.cancel){
                //         console.log("用户点击了取消")
                //     }
                //   },   
                // })



                 // 弹窗提示(优化后的代码)
                 let result = await showModal({content:"您是否要删除该商品？"});
                 if(result.confirm){
                            cart.splice(index,1);
                            this.setCart(cart)
                        }else if(result.cancel){
                            console.log("用户点击了取消")
                        }

            }
            // 进行数量修改
            cart[index].num +=operation;
            // 设置回缓存和data中
            this.setCart(cart);

        },


        // 9 点击结算功能
        //     9.1）判断有没有收获地址信息
        //     9.2）判断用户有没有选购商品
        //     9.3）经过以上验证 跳转到 支付页面

       async handlePay(){
            // 判断收货地址
            const {address,totalNum}=this.data;
            // console.log(address)
            if(!address.userName){
                await showToast({title:"你还没用选择收货地址！"})
                return;
            }

            // 判断用户有没有加购商品
            if(totalNum===0) return await showToast({title:'你还没用加购商品'});
            // 跳转到支付页面
            wx.navigateTo({
              url: '/pages/pay/index',
            })

        }









})